AnsibleをMacでpipからインストール出来ないときの1つの解決方法
サーモン大好き横山です。
今回はMacでansibleをpip installするときに少し嵌った出来事を紹介します。
準備
virtualenvで環境作成します。
$ virtualenv venv $ . venv/bin/activate $ pip install -U pip
pycryptoが入らない
んじゃ、さくっと pip install ansible==2.1
で入れていきましょう。
$ pip install ansible==2.1 ... (省略) ... clang -fno-strict-aliasing -fno-common -dynamic -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers -fwrapv -Wall -Wstrict-prototypes -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/usr/include/ -I/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/_fastmath.c -o build/temp.macosx-10.11-x86_64-2.7/src/_fastmath.o src/_fastmath.c:36:11: fatal error: 'gmp.h' file not found # include <gmp.h> ^ 1 error generated. error: command 'clang' failed with exit status 1 ---------------------------------------- Failed building wheel for pycrypto ... (省略) ...
エラーを見る限り、 gmp
のパッケージ関連が足りない、見つけられないって出てます。
gmpを探そう
Homebrewにあるか確認。 Homebrewで見つからないどころか、既にインストール済でした。
$ brew search gmp gmp ✔ homebrew/versions/gmp4 homebrew/php/php53-gmp homebrew/php/php54-gmp homebrew/php/php55-gmp homebrew/php/php56-gmp homebrew/php/php70-gmp $ brew list | grep gmp gmp
んじゃどこにあるの?ということで、 find
コマンドで gmp.h
探して見ましょう。
$ sudo find /usr -name gmp.h /usr/local/Cellar/gmp/6.0.0a/include/gmp.h /usr/local/Cellar/gmp/6.1.0/include/gmp.h /usr/local/include/gmp.h
/usr/local/include/gmp.h
あるんじゃん!
正確には /usr/local/include/gmp.h
は /usr/local/Cellar/gmp/6.1.0/include/gmp.h
を見ているリンクファイルでした。
じゃぁ、このディレクトリパスをCFLAGSにインクルードパスとして追加して、実行しよう。
今度は -lgmp がない
では先ほどのディレクトリをCFLAGSにインクルードパスを追加して再度コマンド実行します。
$ env "CFLAGS=-I/usr/local/include" pip install ansible==2.1" ... (省略) ... clang -fwrapv -Wall -Wstrict-prototypes -I/usr/local/include -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/usr/include/ -I/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/_fastmath.c -o build/temp.macosx-10.11-x86_64-2.7/src/_fastmath.o src/_fastmath.c:1545:20: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare] else if (result < 0) ~~~~~~ ^ ~ src/_fastmath.c:1621:20: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare] else if (result < 0) ~~~~~~ ^ ~ 2 warnings generated. clang -bundle -undefined dynamic_lookup -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -I/usr/local/include build/temp.macosx-10.11-x86_64-2.7/src/_fastmath.o -lgmp -o build/lib.macosx-10.11-x86_64-2.7/Crypto/PublicKey/_fastmath.so ld: library not found for -lgmp clang: error: linker command failed with exit code 1 (use -v to see invocation) error: command 'clang' failed with exit status 1 ---------------------------------------- ... (省略) ...
Warningが出つつも、コンパイルは通ったみたいですが、今度はライブラリ -lgmp
が解決出来ないご様子。
では、 libgmp
あたりをファイル内で探してみましょう。
$ sudo find /usr -name "libgmp*" /usr/local/Cellar/gmp/6.0.0a/lib/libgmp.10.dylib /usr/local/Cellar/gmp/6.0.0a/lib/libgmp.a /usr/local/Cellar/gmp/6.0.0a/lib/libgmp.dylib /usr/local/Cellar/gmp/6.0.0a/lib/libgmpxx.4.dylib /usr/local/Cellar/gmp/6.0.0a/lib/libgmpxx.a /usr/local/Cellar/gmp/6.0.0a/lib/libgmpxx.dylib /usr/local/Cellar/gmp/6.1.0/lib/libgmp.10.dylib /usr/local/Cellar/gmp/6.1.0/lib/libgmp.a /usr/local/Cellar/gmp/6.1.0/lib/libgmp.dylib /usr/local/Cellar/gmp/6.1.0/lib/libgmpxx.4.dylib /usr/local/Cellar/gmp/6.1.0/lib/libgmpxx.a /usr/local/Cellar/gmp/6.1.0/lib/libgmpxx.dylib /usr/local/Cellar/openssl/1.0.1k/lib/engines/libgmp.dylib /usr/local/Cellar/openssl/1.0.2/lib/engines/libgmp.dylib /usr/local/Cellar/openssl/1.0.2a-1/lib/engines/libgmp.dylib /usr/local/Cellar/openssl/1.0.2d_1/lib/engines/libgmp.dylib /usr/local/Cellar/openssl/1.0.2e_1/lib/engines/libgmp.dylib /usr/local/Cellar/openssl/1.0.2f/lib/engines/libgmp.dylib /usr/local/Cellar/openssl/1.0.2h_1/lib/engines/libgmp.dylib /usr/local/lib/libgmp.10.dylib /usr/local/lib/libgmp.a /usr/local/lib/libgmp.dylib /usr/local/lib/libgmpxx.4.dylib /usr/local/lib/libgmpxx.a /usr/local/lib/libgmpxx.dylib
/usr/local/lib
に有りますね、では、これもCFLAGSにライブラリ検索パスとして含めて再度実行します。
結果
ライブラリ検索のパスをCFLAGSに追加して再度実行します。
$ env "CFLAGS=-I/usr/local/include -L/usr/local/lib" pip install ansible==2.1 ... (省略) ... Building wheels for collected packages: pycrypto Running setup.py bdist_wheel for pycrypto ... done Stored in directory: /Users/yokoyamafumihito/Library/Caches/pip/wheels/80/1f/94/f76e9746864f198eb0e304aeec319159fa41b082f61281ffce Successfully built pycrypto Installing collected packages: pycrypto, ansible Successfully installed ansible-2.1.0.0 pycrypto-2.6.1
ansible==2.1
がインストールできました。
因みに ansible==2.1
だけの問題ではなく ansible
(1.9)で実行しても pycrypto
のインストールでコケます。
まとめ
CFLAGSでpipのビルドするときのパス追加出来ることを知れたのが個人的に大きかった。
「macでpipでインストールしたansible使いたいのに…」という人の参考になれば幸いです。